﻿#include<iostream>

using namespace std;

//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//protected:
//	string _name = "peter"; 
//	int _age = 18; 
//};
//
//
//// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了
////Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象，可
////以看到变量的复用。调用Print可以看到成员函数的复用。
//class Student : public Person
//{
//protected:
//	int _stuid; // 学号
//};
//
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//
//
//
//int main()
//{
//	Student s;
//	Teacher t;
//	s.Print();
//	t.Print();
//	return 0;
//}
//
//
//class Person
//{
//protected:
//	string _name; 
//	string _sex;
//	int _age; 
//};
//class Student : public Person
//{
//public:
//	int _No; // 学号
//};
//
//
//void Test()
//{
//	Student sobj;
//	// 1.子类对象可以赋值给父类对象/指针/引用
//	Person pobj = sobj;
//	Person* pp = &sobj;
//	Person& rp = sobj;
//
//	//2.基类对象不能赋值给派生类对象
//	//sobj = pobj;
//
//	// 3.基类的指针可以通过强制类型转换赋值给派生类的指针
//	pp = &sobj;
//	Student * ps1 = (Student*)pp; // 这种情况转换时可以的。
//	ps1->_No = 10;
//
//	pp = &pobj;
//	Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以，但是会存在越界访问的问
//	ps2->_No = 10;
//}

// Student的_num和Person的_num构成隐藏关系，可以看出这样代码虽然能跑，但是非常容易混淆
//class Person
//{
//protected:
//	string _name = "小李子";
//	int _num = 111;
//};
//class Student : public Person
//{
//public:
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << " 身份证号:" << Person::_num << endl;
//		cout << " 学号:" << _num << endl;
//	}
//protected:
//	int _num = 999; // 学号
//};
//
//void Test()
//{
//	Student s1;
//	s1.Print();
//};
//
//
//// B中的fun和A中的fun不是构成重载，因为不是在同一作用域
//// B中的fun和A中的fun构成隐藏，成员函数满足函数名相同就构成隐藏。
//class A
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//
//class B : public A
//{
//public:
//	void fun(int i)
//	{
//		A::fun();
//		cout << "func(int i)->" << i << endl;
//	}
//};
//
//
//void Test()
//{
//	B b;
//	b.fun(10);
//	b.A::fun();
//};


//class Person
//{
//public:
//	Person(const char* name = "peter")
//	//Person(const char* name)
//		: _name(name)
//	{
//		cout << "Person()" << endl;
//	}
//
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout << "Person(const Person& p)" << endl;
//	}
//
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//
//		return *this;
//	}
//
//	~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//protected:
//	string _name; // 姓名
//};
//
//
//class Student : public Person
//{
//public:
//	Student(const char* name, int num)
//		: Person(name)
//		, _num(num)
//	{
//		cout << "Student()" << endl;
//	}
//	Student(const Student& s)
//		: Person(s)
//		, _num(s._num)
//	{
//		cout << "Student(const Student& s)" << endl;
//	}
//	Student& operator = (const Student& s)
//	{
//		cout << "Student& operator= (const Student& s)" << endl;
//		if (this != &s)
//		{
//			Person::operator =(s);
//			_num = s._num;
//		}
//		return *this;
//	}
//	~Student()
//	{
//		cout << "~Student()" << endl;
//	}
//protected:
//	int _num; //学号
//};
//
//
//void Test()
//{
//	Student s1("jack",18);
//	//Student s3("rose", 17);
//	//s1 = s3;
//}
//
//int main()
//{
//	Test();
//}

//class Student;
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	//友元关系不能继承
//	//cout << s._stuNum << endl;
//}
//void main()
//{
//	Person p;
//	Student s;
//	Display(p, s);
//}

//
//class Person
//{
//public:
//	Person() { ++_count; }
//protected:
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//
//
//int Person::_count = 0;
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//class Graduate : public Student
//{
//protected:
//string _seminarCourse; // 研究科目
//};
//
//
//void TestPerson()
//{
//	Student s1;
//	Student s2;
//	Student s3;
//	Graduate s4;
//	cout << " 人数 :" << Person::_count << endl;
//	Student::_count = 0;
//	cout << " 人数 :" << Person::_count << endl;
//}
//
//int main()
//{
//	TestPerson();
//	return 0;
//}


//class Person
//{
//public:
//	string _name; // 姓名
//};
//
//class Student : public Person
//{
//protected:
//	int _num; //学号
//};
//
//class Teacher : public Person
//{
//protected:
//	int _id; // 职工编号
//};
//
//
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//
//
//void Test()
//{
//	// 这样会有二义性无法明确知道访问的是哪一个
//	Assistant a;
//	a._name = "peter";
//	// 需要显示指定访问哪个父类的成员可以解决二义性问题，但是数据冗余问题无法解决
//	a.Student::_name = "xxx";
//	a.Teacher::_name = "yyy";
//}

//
//class Person
//{
//public:
//	string _name; // 姓名
//};
//
//
//class Student : virtual public Person
//{
//protected:
//	int _num; //学号
//};
//
//
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职工编号
//};
//
//
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//
//
//void Test()
//{
//	Assistant a;
//	a._name = "peter";
//}
//
//int main()
//{
//	Test();
//	return 0;
//}


//class A
//{
//public:
//	int _a;
//};
//
//// class B : public A
//class B : virtual public A
//{
//public:
//	int _b;
//};
//
//
//// class C : public A
//class C : virtual public A
//{
//public:
//	int _c;
//};
//
//class D : public B, public C
//{
//public:
//	int _d;
//};
//
//int main()
//{
//	D d;
//	d.B::_a = 1;
//	d.C::_a = 2;
//	d._b = 3;
//	d._c = 4;
//	d._d = 5;
//
//	B* ptr = &d;
//	cout << ptr->_a << endl;
//
//	B b;
//	b._a = 10;
//	ptr = &b;
//	cout << ptr->_a << endl;
//
//	return 0;
//}

//____________________________________________________________________
#include<queue>
#include<vector>
#include<string>

//int main()
//{
//
//	priority_queue<int> a;
//
//	priority_queue<int, vector<int>, greater<int> > c;
//
//	priority_queue<string> b;
//
//	for (int i = 0; i < 5; i++)
//
//	{
//
//		a.push(i);
//
//		c.push(i);
//
//	}
//
//	while (!a.empty())
//
//	{
//
//		cout << a.top() << ' ';
//
//		a.pop();
//
//	}
//
//	cout << endl;
//
//	while (!c.empty())
//
//	{
//
//		cout << c.top() << ' ';
//
//		c.pop();
//
//	}
//
//	cout << endl;
//
//	b.push("abc");
//
//	b.push("abcd");
//
//	b.push("cbd");
//
//	while (!b.empty())
//
//	{
//
//		cout << b.top() << ' ';
//
//		b.pop();
//
//	}
//
//	cout << endl;
//
//	return 0;
//
//}

//int main()
//{
//	priority_queue<int, vector<int>, greater<int>> pq;
//	pq.push(10);
//	pq.push(60);
//	pq.push(90);
//	pq.push(20);
//
//	while (!pq.empty())
//	{
//		cout << pq.top()<<" ";
//		pq.pop();
//	}
//	cout << endl;
//	return 0;
//}

int main()
{
    vector<int> nums{ 3,2,1,5,6,4 };
    priority_queue<int> pq;
    int k = 2;
    for (int i = 0; i < k; i++)
    {
        pq.push(nums[i]);
    }

    while (--k)
    {
        pq.pop();
    }

}